/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Gestiongrupo;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import gestionJDBC.*;
import Gestionequipo.*;
import gestionTemporada.*;
import Gestioncategorias.*;
import java.util.Date;
import java.text.*;
/**
 *
 * @author Adrian
 */
public class GrupoDB {
    
     private static gestorJDBC gestor = gestorJDBC.getInstance();

 
     public Date DeStringADate(String fecha){
        
        SimpleDateFormat formato= new SimpleDateFormat("dd-MM-yyyy");
        String strFecha = fecha;
        Date fechaDate = null;
        
        try {
            
            fechaDate = formato.parse(strFecha);
            return fechaDate;
        
        } catch (ParseException ex) {
            
            ex.printStackTrace();
            return fechaDate;

        }
        
    }
         
     public ArrayList <Grupo> buscaGrupo(String nombre, Categoria c){
         
            ArrayList <Grupo> gr = new ArrayList<Grupo>();
                     
            ResultSet rs = null;
            ResultSet rs2 = null;
            
            //Tipo(id_grupo, id_categoria):
            rs = gestor.Consultar("SELECT grupo.id_grupo,grupo.nombre from grupo, tipo where grupo.nombre like '" + nombre 
                                    +"' and tipo.id_categoria="+c.GetId()+" and grupo.id_grupo=tipo.id_grupo");
            
            int i = 0;
    
            try{
                
                while(rs.next()){
                    
                    gr.add(new Grupo());
                    gr.get(i).SetId((Integer)rs.getObject("id_grupo"));
                    gr.get(i).SetNombre(rs.getObject("nombre").toString());
                    
                    rs2 = gestor.Consultar("SELECT equipo.id_equipo, equipo.nombre from agrupado, equipo where "
                                            + "equipo.alta=1 and agrupado.valido=1 and "
                                            + "equipo.id_equipo=agrupado.id_equipo and agrupado.id_grupo="+gr.get(i).GetId());
                    
                    try{
                        
                      
                        while(rs2.next()){
                            
                            Equipo eq = new Equipo();
                            
                            eq.SetId((Integer)rs2.getObject("id_equipo"));
                            eq.SetNombre(rs2.getObject("nombre").toString());
                            
                            gr.get(i).SetEquipo(eq);
                            
                        }
                    
                    }catch(SQLException e ){
                        
                                JOptionPane.showMessageDialog(null,"Error al obtener los equipos de un grupo"
                                                                    + " que esta siendo buscado\n"
                                + e.getMessage());
                    }

                    gr.get(i).SetCategoria(c);
                            

                    i++;
                
                }
                

            }catch(SQLException e ){
                JOptionPane.showMessageDialog(null,"Error al obtener los grupos\n"
                                + e.getMessage());
            }
                        
            return gr;
         
     }
   
     public boolean inscribeEquipoFundación(Integer ide, Integer idg){
         
         
            boolean confirmacion;
                    
            //Agrupado(id_equipo, id_grupo, valido):
            
            confirmacion = gestor.Insertar("INSERT INTO agrupado (id_equipo, id_grupo,valido) "
                                            + "VALUES ("+ ide + "," 
                                            + idg + ", 1)");
                    
            return confirmacion;
     
     }

     public boolean inscribeEquipo(Integer ide , Integer idg){
         
            boolean confirmacion;
                    
            //Agrupado(id_equipo, id_grupo, valido):
            
            confirmacion = gestor.Insertar("INSERT INTO agrupado (id_equipo,id_grupo,valido) "
                                            + "VALUES ("+ ide + "," 
                                            + idg + ", 1)");
                    
            return confirmacion;
         
         
     }
     
     public boolean darBajaEquipo(Integer ide, Integer idg){
         
        boolean confirmacion;
                    
        //Agrupado(id_equipo, id_grupo, valido):
            
        confirmacion = gestor.Modificar("UPDATE agrupado SET valido=0 WHERE id_equipo="+ ide + " and id_grupo=" +idg);
                    
        return confirmacion;
         
     }
     
     public boolean modificaGrupo(Integer idg,String nombre,Integer idc){
         
        boolean confirmacion;
                    
        //Agrupado(id_equipo, id_grupo, valido):
            
        confirmacion = gestor.Modificar("UPDATE grupo SET nombre='"+ nombre+ "' WHERE id_grupo="+ idg);
        
        if(confirmacion){
            
            confirmacion = gestor.Modificar("UPDATE tipo SET id_categoria="+idc+" WHERE id_grupo="+ idg);

        }
                    
        return confirmacion;
         
     }

     public boolean creaGrupo(Grupo g, Integer id_categoria){
         
          boolean confirmacion;
          Integer id;
          id = 0;
                    
          //Arupado(id_equipo, id_grupo, valido):
            
          confirmacion = gestor.Insertar("INSERT INTO grupo (nombre, alta) "
                                            + "VALUES ('"+ g.GetNombre() +"',1)");
         
          
          if(confirmacion){
              
            /* Consultamos el maximo id de los equipos que se encuentra en la fundacion */
            ResultSet rs2 =gestor.Consultar("SELECT max(id_grupo) AS max_grupo FROM grupo");
            
          
            try {

                rs2.next();
                id=(Integer)rs2.getObject("max_grupo");

            } catch (SQLException e) {
                
                
                id = -1;

                JOptionPane.showMessageDialog(null, "Fallo al intentar conseguir el id del nuevo grupo\n"+e.getMessage());
            }
          
          }
          
          if(confirmacion==true && id!=-1){
              
              
              confirmacion = gestor.Insertar("INSERT INTO tipo (id_grupo,id_categoria) "
                                            + "VALUES ("+id+","+ id_categoria + ")");
          }
                      
          return confirmacion;
     }

     public boolean compruebaJugadoresValidos(Equipo eq, Grupo g){
                     
            ResultSet rs = null;
            
            Categoria c = new Categoria();

            
            //Tipo(id_grupo, id_categoria):
            rs = gestor.Consultar("SELECT categoria.id_categoria,categoria.nombre,categoria.sexo,"
                                    + "categoria.edad_maxima,categoria.edad_minima from"
                                    + " categoria ,tipo where categoria.id_categoria = tipo.id_categoria and "
                                    + "tipo.id_grupo=" + g.GetId()); 
         
            //Categoría (id_categoria, nombre, sexo, edad_maxima, edad_minima
            
            try{
                        
                      
                while(rs.next()){
                    
                    c.SetId((Integer) rs.getObject("id_categoria"));
                    c.SetNombre(rs.getObject("nombre").toString());
                    c.SetSexo(rs.getObject("sexo").toString());
                    c.SetEdadMaxima((Integer) rs.getObject("edad_maxima"));
                    c.SetEdadMinima((Integer) rs.getObject("edad_minima"));

                }
                    
            }catch(SQLException e ){

                        JOptionPane.showMessageDialog(null,"Error al obtener los equipos de un grupo\n"
                        + e.getMessage());
            }
            
        
            for(int i=0;i<eq.GetTamanio();i++){
                             
                if((c.GetSexo()).equals((eq.GetJugador(i)).getSexo())){
             
                
                    return false;
                }
                
                Date nacimiento = DeStringADate((eq.GetJugador(i)).getFecha_nacimiento());
                
                /* Supuestamente esto nos da la fecha actual */
                Date fecha_actual = new Date();
                
                Integer actual = fecha_actual.getYear();
                Integer nac = nacimiento.getYear();
                
                int edad_jugador = actual-nac;
                                
                if(edad_jugador > (c.GetEdadMaxima()) || edad_jugador < (c.GetEdadMinima())){
                    
                    return false;
                    
                }
         
            
            }
                        
            return true;
         
     }
     
     /**
      * Actualiza la posicion de un equipo
      */
     
     public boolean actualizaPosicion(Posicion p){
         
         boolean exito=false;
         ResultSet rs;
         
         rs=gestor.Consultar("Select * from equipo_fundacion where id_equipo='"+p.getId_equipo()+"'");
        try {
            if(rs.next()){
                rs=gestor.Consultar("Select * from posicion where id_equipo='"+p.getId_equipo()+"'");
                
                if(rs.next()){
                    exito=gestor.Modificar("Update posicion set pos_clasificacion='"+p.getPos_clasificacion()
                            +"', partidos_ganados='"+p.getPartidos_ganados()+"', partidos_perdidos='"
                            +p.getPartidos_perdidos()+"', puntos_a_favor='"+p.getPuntos_favor()+"', puntos_en_contra='"
                            +p.getPuntos_contra()+"' where id_equipo='"+p.getId_equipo()+"'");
                    
                }
                else{
                    exito=gestor.Insertar("Insert into posicion values ('"+p.getId_equipo()
                            +"','"+p.getId_grupo()+"','"+p.getPos_clasificacion()+"','"
                            +p.getPartidos_ganados()+"','"+p.getPartidos_perdidos()+"','"
                            +p.getPuntos_favor()+"','"+p.getPuntos_contra()+"')");
                }
                
                        
            }
            else{
                JOptionPane.showMessageDialog(null, "ERROR debe seleccionar un equipo de la fundacion \n");
            }
        } catch (SQLException ex) {
            Logger.getLogger(GrupoDB.class.getName()).log(Level.SEVERE, null, ex);
        }
        return exito;
     }
     
     public Posicion getPosicion(int id_equipo){
         Posicion p=new Posicion();
         ResultSet rs;
         
         rs=gestor.Consultar("Select id_equipo,id_grupo,pos_clasificacion,partidos_ganados,partidos_perdidos"
                   +",puntos_a_favor,puntos_en_contra from posicion where id_equipo='"+id_equipo+"'");
        try {
            while(rs.next()){
                
                p.setId_equipo((Integer) rs.getObject("id_equipo"));
                p.setId_grupo((Integer) rs.getObject("id_grupo"));
                p.setPos_clasificacion((Integer) rs.getObject("pos_clasificacion"));
                p.setPartidos_ganados((Integer) rs.getObject("partidos_ganados"));
                p.setPartidos_perdidos((Integer) rs.getObject("partidos_perdidos"));
                p.setPuntos_favor((Integer) rs.getObject("puntos_a_favor"));
                p.setPuntos_contra((Integer) rs.getObject("puntos_en_contra"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(GrupoDB.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return p;
        
     }
     
     /*
      * Devuelve el grupo en el que juega un equipo
      */
     public int getIdGrupoEquipo (int id_eq){
         ResultSet rs;
         
         int gr = -1;
         
         rs = gestor.Consultar("SELECT id_grupo from agrupado WHERE id_equipo='"+id_eq+"'");         
         
         try {             
            while(rs.next()){
                gr = (Integer) rs.getObject("id_grupo");    
                
            }
        } catch (SQLException ex) {
            Logger.getLogger(GrupoDB.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return gr;
     }
}


